/**
 * 
 * 
 *  
 *====================================================
 * 文件名称: CtrlTableService.java
 * 修订记录：
 * No    日期				作者(操作:具体内容)
 * 1.    Mar 3, 2009		(创建:创建文件)
 * 2.    Mar 3, 2009        根据 注释 规范进行调整
 *====================================================
 * 类描述：
 * 
 */
package com.devframe.sysconfig.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.devframe.sys.util.assertion.Assert;
import com.devframe.sysbase.service.BaseService;
import com.devframe.sysconfig.service.CtrlTableService;
import com.devframe.sysconfig.storage.operate.ReaderCacheData;
import com.devframe.sysconfig.storage.operate.WriterCacheData;



/**
 * 
 *<pre><b><font color="blue">CtrlTableServiceImpl</font></b></pre>
 *
 * 控制表缓存对象加载、读取服务类
 * 在T_INIT_LOAD_TABLE表中TABLE_TYPE=2的表，没有配置的表不提供缓存
 * 配置的表在需要的时候加载，不在启动时自动加载，避免启动速度过慢影响开发效率。
 * <pre>
 * <b>--样例--</b>
 *   CtrlTableServiceImpl obj = new CtrlTableServiceImpl();
 *   obj.method();
 * </pre>
 * JDK版本：JDK1.4
 * @author  <b></b>
 */
@Service(value="ctrlTableService")
public class CtrlTableServiceImpl extends BaseService implements CtrlTableService {
    
	
	/**
	 * logger
	 */
	private static Logger logger = Logger.getLogger(CtrlTableServiceImpl.class);

	
	 @Autowired
	 private WriterCacheData writerCacheData;
	 
	 @Autowired
	 private ReaderCacheData readerCacheData;
	
//	/**
//	 * ctrlTables
//	 * 控制表缓存
//	 */
//	private HashMap ctrlTables=new HashMap();
//	/**
//	 * ctrlTableSet
//	 * 配置的控制表，在初始化时加载
//	 */
//	private HashMap ctrlTableSet = new HashMap();
	
	/**
     * 控制表缓存初始化方法，也用于刷新缓存。
     * 
     * 
     */
	public void init() {
	    logger.info("开始初始化控制表缓存...");
	    this.writerCacheData.cleanCtrlTableData();
	    String sql = "SELECT TABLE_ALIAS,TABLE_NAME FROM T_INIT_LOAD_TABLE A WHERE A.TABLE_TYPE='2' ";
	    List tableList =super.getBaseDao().sqlQueryForList(sql);
	    Map table;
	    int len;
	    if(tableList!=null){
	         len= tableList.size();
	        for(int i=0;i<len;i++){
	             table= (Map) tableList.get(i);
	            this.writerCacheData.addCtrlTableSet(table.get("TABLE_ALIAS").toString(), table.get("TABLE_NAME").toString());
	        }
	        logger.info("共配置" + len + "个控制表.");
	    } else {
	        logger.info("共配置" + 0 + "个控制表.");
	    }
	}
	
	

	/**
	 * 查询缓存控制表记录
     * @param tableAlias tableAlias
     * @return List
     * 
     */
	public List loadCtrlTable(String tableAlias) {
	    String tableName = (String) this.readerCacheData.getCtrlTableSet(tableAlias);
	    List list = super.getBaseDao().sqlQueryForList("SELECT * FROM "+tableName);
	    return  list;
	}
	
	

//	/**
//     * 单行查询缓存控制表记录
//     * @param tableAlias tableAlias
//     * @param colName 字段名
//     * @param colValue 字段值
//     * @return 一行记录，无则返回Null
//     * 
//     */
//	public Map queryRow(String tableAlias, String colName, String colValue) {
//		List configTable = this.query(tableAlias);
//		for(Iterator it = configTable.iterator(); it.hasNext();){
//			Map config = (Map)it.next();
//			if(colValue.equals(config.get(colName))){
//				return config;
//			}
//		}
//		return null;
//	}
//
//	/**
//	 * 控制表缓存查询
//     * @param tableAliasName 别名
//     * @param colNameArr 过滤字段列表
//     * @param colValueArr 过滤值列表
//     * @return 记录列表List
//     * 
//     */
//	public List query(String tableAliasName, String[] colNameArr, String[] colValueArr) {
//		List configTable = this.query(tableAliasName);
//		List configValues = new ArrayList();
//		for(Iterator it = configTable.iterator(); it.hasNext();){
//			Map config = (Map)it.next();
//			boolean selected = true;
//			for(int i = 0; i < colNameArr.length; i++){
//				if(config.get(colNameArr[i]) != null && !colValueArr[i].equals(config.get(colNameArr[i]).toString())){
//					selected = false;
//					break;
//				}
//			}
//			if(selected){
//				configValues.add(config);
//			}
//		}
//		return configValues;
//	}
//
//	/**
//	 * 控制表缓存查询-根据字段名和字段条件查询记录列表
//     * @param tableAliasName 别名
//     * @param colName 字段名
//     * @param colValue 字段值 
//     * @return 符合条件的记录
//     * 
//     */
//	public List query(String tableAliasName, String colName, String colValue) {
//	    return query(tableAliasName,new String[]{colName},new String[]{colValue});
//	}
//	
//	/**
//	 * 控制表缓存查询-根据字段名和字段条件查询记录列表
//     * @param tableAliasName 别名
//     * @param colName 字段名
//     * @param colValue 字段值 
//     * @param destCol 目标字段
//     * @return 符合条件的记录的目标字段值
//     * 
//     */
//	public String query(String tableAliasName, String colName, String colValue, String destCol) {
//		List configTable = this.query(tableAliasName);
//		for(Iterator it = configTable.iterator(); it.hasNext();){
//			Map config = (Map)it.next();
//			if(colValue.equals(config.get(colName))){
//				return (String)config.get(destCol);
//			}
//		}
//		return null;
//	}
//
//	/**
//     * 控制表缓存查询——查询符合条件的记录的目标字段值
//     * @param tableAliasName 别名
//     * @param colNameArr 过滤字段列表
//     * @param colValueArr 过滤值列表
//     * @param destCol 目标字段
//     * @return 目标字段值
//     * 
//     */
//	public String query(String tableAliasName, String[] colNameArr, String[] colValueArr, String destCol) {
//		List configTable = this.query(tableAliasName);
//		for(Iterator it = configTable.iterator(); it.hasNext();){
//			Map config = (Map)it.next();
//			boolean selected = true;
//			for(int i = 0; i < colNameArr.length; i++){
//				if(config.get(colNameArr[i]) == null || !colValueArr[i].equals(config.get(colNameArr[i]).toString())){
//					selected = false;
//				}
//			}
//			if(selected){
//			    return (String)config.get(destCol);
//			}
//		}
//		return null;
//	}



	public void setWriterSysConfigData(WriterCacheData writerSysConfigData) {
		this.writerCacheData = writerSysConfigData;
		this.writerCacheData.bindCtrlTableService(this);
	}



	public void setReaderCacheData(ReaderCacheData readerCacheData) {
		this.readerCacheData = readerCacheData;
	}





}
